iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0


📌 本主題系列工作流所生成的文章,請參考另一個主題系列:[轉生到鬼島的反派,為了生存必須在30天內學會30種 AI 工具!]
📌 本主題內容以個人經驗為主探索 AIGC 協作工作流,建議讀者搭配個人情境參考適用程度
📌 文中使用『引用格式』代表輸入的 Prompt

💡
這是輸入的 Prompt

⚠️ 天才與瘋子只有一線之隔,使用 AIGC 請注意幻覺的副作用,建議搭配應用領域的相關 domain 服用。
⚠️ 由於 AIGC 突飛猛進,本系列介紹的工具版本可能快速的變更而有所差異

打造個人自動化 Fabric 工作流 (Debug)

在 [Level 2] 時我們已經透過 Cursor 幫我們寫了一個 bash shell script,來自動化將一批的 Youtube 影片網址清單進行標籤與評分。

不過在進行多次的測試後,有兩個主要的錯誤。一個是在處理 Fabric 回傳的 json 內容時,偶而會有特殊字元的處理 error。第二個則是雖然提供了多筆影片網址,但都只產生第一筆的標籤與評分內容。

在多次的嘗試讓 Cursor 修了 A 又錯了 B 的鬼打牆之後,我意識到轉換高階語言可能會比較簡單。因為很多底層可能遇到的問題,在主要程式庫中都會有完整的異常處理。

本機自動化腳本 - Python 版本

因此我們希望可以有一個列表,讓個人電腦自動讀取列表中的 Youtube 影片網址。並依序呼叫 Fabric 的 Pattern,最後將標籤與評分結果更新到列表中。

那既然已經安裝了 Cursor,那我們就將這個需求丟給 AI 來幫我們想想辦法:

💡
我想開發一個 python script 讀取 csv 檔案
檔案中有幾個欄位,一個欄位是 video_url,其他欄位是 command line 指令輸出的 json 內容。
首先讀取 csv 檔案後,會將 video_url 當作參數呼叫一個 command line 指令。
最後將指令的 json 輸出結果中的欄位內容,依序填入 csv 檔案的對應欄位。

最後 Cursor 便幫我們生成了下面的 python 腳本,這樣我們只要新增一批 csv 中的影片網址,便可以每天自動讓 Fabric 幫我們批次評估影片是否值得花時間投資囉!

import csv
import json
import subprocess
import sys

def execute_command(video_url):
    # 這裡替換成實際的命令行指令
    command = f"fabric -y {video_url} | fabric -sp label_and_rate"
    try:
        result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True)
        return json.loads(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"執行命令時出錯:{e}")
        return {}
    except json.JSONDecodeError as e:
        print(f"解析 JSON 時出錯:{e}")
        return {}

def process_csv(input_file, output_file):
    with open(input_file, 'r', newline='', encoding='utf-8') as infile, open(output_file, 'w', newline='', encoding='utf-8') as outfile:
        reader = csv.DictReader(infile)
        fieldnames = reader.fieldnames
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        writer.writeheader()

        for row in reader:
            video_url = row['video_url']
            json_result = execute_command(video_url)
            
            # 更新行中的其他欄位
            for key in fieldnames:
                if key != 'video_url' and key in json_result:
                    row[key] = json_result[key]
            
            writer.writerow(row)

def main():
    if len(sys.argv) != 3:
        print("使用方法: python script.py <input_csv> <output_csv>")
        sys.exit(1)
    
    input_csv = sys.argv[1]
    output_csv = sys.argv[2]
    process_csv(input_csv, output_csv)

if __name__ == "__main__":
    main()

本機自動化腳本 - Golang 版本

由於 Fabric 新版本是用 Golang 開發,那我們也試試用 Cursor 開發 Golang 程式,之後可以考慮學習 Fabric 的原始碼並開發擴充功能。

因此我們希望可以有一個列表,讓個人電腦自動讀取列表中的 Youtube 影片網址。並依序呼叫 Fabric 的 Pattern,最後將標籤與評分結果更新到列表中。

那既然已經安裝了 Cursor,那我們就將這個需求丟給 AI 來幫我們想想辦法:

💡
我想開發一個 Golang 程式讀取 csv 檔案
檔案中有幾個欄位,一個欄位是 video_url,其他欄位是 command line 指令輸出的 json 內容。
首先讀取 csv 檔案後,會將 video_url 當作參數呼叫一個 command line 指令。
最後將指令的 json 輸出結果中的欄位內容,依序填入 csv 檔案的對應欄位。

最後 Cursor 便幫我們生成了下面的 Golang 程式,這樣我們只要新增一批 csv 中的影片網址,便可以每天自動讓 Fabric 幫我們批次評估影片是否值得花時間投資囉!

package main

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"os"
	"os/exec"
)

func executeCommand(videoURL string) map[string]interface{} {
	// 這裡替換成實際的命令行指令
	command := fmt.Sprintf("fabric -y %s | fabric -sp label_and_rate", videoURL)
	cmd := exec.Command("bash", "-c", command)
	output, err := cmd.Output()
	if err != nil {
		fmt.Printf("執行命令時出錯:%v\n", err)
		return nil
	}

	var result map[string]interface{}
	err = json.Unmarshal(output, &result)
	if err != nil {
		fmt.Printf("解析 JSON 時出錯:%v\n", err)
		return nil
	}

	return result
}

func processCSV(inputFile, outputFile string) error {
	// 讀取輸入文件
	inFile, err := os.Open(inputFile)
	if err != nil {
		return fmt.Errorf("無法打開輸入文件:%v", err)
	}
	defer inFile.Close()

	reader := csv.NewReader(inFile)
	records, err := reader.ReadAll()
	if err != nil {
		return fmt.Errorf("讀取 CSV 時出錯:%v", err)
	}

	// 創建輸出文件
	outFile, err := os.Create(outputFile)
	if err != nil {
		return fmt.Errorf("無法創建輸出文件:%v", err)
	}
	defer outFile.Close()

	writer := csv.NewWriter(outFile)
	defer writer.Flush()

	// 寫入標題行
	if err := writer.Write(records[0]); err != nil {
		return fmt.Errorf("寫入標題行時出錯:%v", err)
	}

	// 處理每一行
	for _, record := range records[1:] {
		videoURL := record[0]
		jsonResult := executeCommand(videoURL)

		if jsonResult != nil {
			for i, field := range records[0] {
				if i != 0 && jsonResult[field] != nil {
					record[i] = fmt.Sprintf("%v", jsonResult[field])
				}
			}
		}

		if err := writer.Write(record); err != nil {
			return fmt.Errorf("寫入行時出錯:%v", err)
		}
	}

	return nil
}

func main() {
	if len(os.Args) != 3 {
		fmt.Println("使用方法: go run script.go <input_csv> <output_csv>")
		os.Exit(1)
	}

	inputCSV := os.Args[1]
	outputCSV := os.Args[2]

	err := processCSV(inputCSV, outputCSV)
	if err != nil {
		fmt.Printf("處理 CSV 時出錯:%v\n", err)
		os.Exit(1)
	}

	fmt.Println("CSV 處理完成")
}

上一篇
[Level 2] 如何打造個人自動化 Fabric 工作流
下一篇
[Level 4] 如何使用 Obsidian 和 Fabric 高效產出 Youtube 教學筆記
系列文
我無限升級,30天解鎖獨自升級金手指!你老闆不能知道的 AIGC 效率激增工作流29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言